package com.istock.union.user.service;

import java.util.List;
import java.util.Map;

import com.istock.union.user.model.DeptInfo;

/**
 * Description:(替换类描述)
 *
 * @author senvon
 */
public interface DeptInfoService {

	/**
	 * 根据条件查询组织机构信息
	 * 
	 * @param deptInfo
	 * @return
	 */
	public List<DeptInfo> selectByExampleNameLike(DeptInfo deptInfo);
	
	/**
	 * 插入组织机构信息
	 * 
	 * @param deptInfo
	 * @return
	 */
	public int insertDept(DeptInfo deptInfo);
	
	/**搜索路径下的所有的机构
	 * @param ancestor
	 * @param currentDeptCode 如果存在,过滤当前的机构,只查询父的
	 * @return
	 */
	public List<DeptInfo> findAncestorDept(String ancestor , String currentDeptCode);
	
	/**
	 * 更新组织机构信息
	 * 
	 * @param menu
	 * @return
	 */
	public int updateDept(DeptInfo dept);

	/**
	 * 统计子组织机构数量
	 * 
	 * @param parentId
	 * @return
	 */
	public long countDeptByParentId(String parentId);

	/**
	 * 统计组织机构下用户数量
	 * 
	 * @param deptId
	 * @return
	 */
	public long countUsersByDeptId(String deptId);

	/**
	 * 根据组织机构ID删除组织机构信息
	 * 
	 * @param id
	 * @return
	 */
	public int deleteDeptById(String id);

	/**
	 * 检查组织机构名称是否唯一
	 * id可以为空
	 * 
	 * @param deptInfo
	 * @return
	 */
	public Boolean checkDeptNameUnique(String parentId , String deptName , String id);
	
	/**检查组织code在全表唯一
	 * @param id
	 * @param deptCode
	 * @return
	 */
	public Boolean checkDeptCodeUnique(String id , String deptCode);
	
	/**列出组织机构树
	 * 在很多场景下,需要列出组织机构树,请使用统一的方法
	 * @param tenantId 当前的租户,可以为空
	 * @param userDeptId 当前的用户登录的机构,可以为空
	 * @param isAdmin 当前登录用户是否为admin用户,如果是,则在树上增加租户信息
	 * @param tenantSelect 租户是否可选
	 * @return
	 */
	public List<Map<String , Object>> queryDeptTreeData(String tenantId , String userDeptId , boolean isAdmin , boolean tenantSelect);
	
	public List<DeptInfo> queryDeptTree(String tenantId , String userDeptId , String deptName , String deptCode);
	
	/**
	 * 对象转组织机构树
	 *
	 * @param deptList 组织机构列表
	 * @param isCheck 是否需要选中
	 * @param roleDeptList 角色已存在菜单列表
	 * @return
	 */
	public List<Map<String, Object>> getTrees(List<DeptInfo> deptList, boolean isCheck, List<String> roleDeptList);

	/**
	 * 根据组织机构主键查询组织机构信息
	 * 
	 * @param id
	 * @return
	 */
	public DeptInfo selectDeptById(String id);
	
	public DeptInfo selectDeptByCode(String deptCode);

	/**
	 * 
	 * @param tenantId
	 * @return
	 */
	public Boolean checkNoSon(String tenantId);

	/**
	 * 根据ID集合查询所有无效的组织机构
	 * 
	 * @param ids
	 * @return
	 */
	public long countInvalidDeptListByIds(List<String> ids);

	/**
	 * 根据ID统计符合状态的子集机构
	 * 
	 * @param id
	 * @param status
	 * @return
	 */
	public long countDeptByAncestorId(String id, Integer status);

}
